package events;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;

import dataStructures.NeighborDataStructure;
import dataStructures.NeighborTable;

import packets.LSA;
import packets.OSPF;
import packets.OSPFAcknowledgement;
import router.Interface;
import router.ProtocolPacketReceiver;

/**
 * Listener, der auf ein eingehendes OSPF Acknowledgement Paket reagiert.
 * @author pascal
 *
 */
public class ReceiveAcknowledgementListener implements ReceivePacketListener {

	
	@Override
	public void processPacket(ReceivedEvent event) {
		
		//Das AckPaket selbst und das gesamte OSPF Paket (inkl. Header)
		OSPFAcknowledgement ackPacket = (OSPFAcknowledgement) event.getProtocolPacket();
		OSPF opsf = event.getProtocolPacket().getPacket().getHeader(new OSPF());
		
		//Alle LSAs deren Empfang bestätigt wird
		ArrayList<LSA> receivedAcks = ackPacket.getLSAs();
		
		//Nachbar aus der Nachbarschaftstabelle, der die Bestätigung sendet

			try {
				NeighborDataStructure transmittingNeighbor = NeighborTable.getInstance().getNeighbor(InetAddress.getByAddress(opsf.routerID()), 
																						(event.getSource()).getRouterInterface());
				
				
		//Entferne bestätigte LSAs aus der "RetransmissionList" des Nachbarn
				
				for(LSA lsaAck : receivedAcks){
					for(LSA lsaInList : transmittingNeighbor.getLinkStateRetransmissionList() ){
						if(lsaAck.equals(lsaInList)){
							transmittingNeighbor.getLinkStateRetransmissionList().remove(lsaInList);
						}
					}
				}
				
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		
		
		
		
		
		
		
	}

}
